﻿using System;
using System.Collections.Generic;

namespace Hxsoft
{
	/// <summary>
	/// 集合扩展类。
	/// </summary>
	public static class ICollectionExtensions
	{
		/// <summary>
		/// 返回集合的并集。
		/// </summary>
		/// <typeparam name="T">集合元素的类型。</typeparam>
		/// <param name="c1">进行运算的集合一。</param>
		/// <param name="c2">进行运算的集合二。</param>
		/// <returns>集合的并集。</returns>
		public static ICollection<T> MergeSet<T>(this ICollection<T> c1, ICollection<T> c2)
		{
			List<T> c = new List<T>(c1);

			foreach (T c2Value in c2)
			{
				if (!c.Contains(c2Value))
					c.Add(c2Value);
			}

			return c;
		}

		/// <summary>
		/// 返回集合的差集。
		/// </summary>
		/// <typeparam name="T">集合元素的类型。</typeparam>
		/// <param name="c">进行差集运算的集合。</param>
		/// <param name="c2">减去的集合。</param>
		/// <returns>集合的差集。</returns>
		public static ICollection<T> DifferenceSet<T>(this ICollection<T> c, ICollection<T> c2)
		{
			List<T> cResult = new List<T>(c);

			foreach (T c2Value in c2)
				cResult.Remove(c2Value);

			return cResult;
		}

		/// <summary>
		/// 返回集合的交集。
		/// </summary>
		/// <typeparam name="T">集合元素的类型。</typeparam>
		/// <param name="c1">进行运算的集合一。</param>
		/// <param name="c2">进行运算的集合二。</param>
		/// <returns>集合的交集。</returns>
		public static ICollection<T> IntersectSet<T>(this ICollection<T> c1, ICollection<T> c2)
		{
			List<T> cResult = new List<T>();

			foreach (T c2Value in c2)
			{
				if (c1.Contains(c2Value))
					cResult.Add(c2Value);
			}

			return cResult;
		}

		/// <summary>
		/// 确定一个集合是否包含另一个集合。
		/// </summary>
		/// <typeparam name="T">集合元素的类型。</typeparam>
		/// <param name="c">接受搜索的集合。</param>
		/// <param name="c2">要搜索的集合。</param>
		/// <returns>布尔值表示一个集合是否包含另外一个集合。</returns>
		public static bool IsContains<T>(this ICollection<T> c, ICollection<T> c2)
		{
			foreach (T c2Value in c2)
			{
				if (!c.Contains(c2Value))
					return false;
			}

			return true;
		}
	}
}